草庐IT

MySQL InnoDB 锁的二三事

全部标签

synchronization - 如何将此代码转换为非阻塞和无锁的?

我有队列,必须有越来越大的缓冲区,这不包括我在go中使用缓冲channel。经过一些谷歌搜索后,我想出了这段代码:import("sync")typeQueuestruct{nodes[]interface{}head,tail,countintlcksync.RWMutex}func(q*Queue)Enqueue(vinterface{}){q.lck.Lock()deferq.lck.Unlock()ifq.nodes==nil{q.nodes=make([]interface{},2)}ifq.head==q.tail&&q.count>0{nodes:=make([]inte

thread-safety - Go 的缓冲 channel 是无锁的吗?

Go的缓冲channel本质上是一个线程安全的FIFO队列。(参见IsitpossibletouseGo'sbufferedchannelasathread-safequeue?)我想知道它是如何实现的。它是否像Istheresuchathingasalocklessqueueformultiplereadorwritethreads?中描述的那样是无锁的??在Go的src目录中进行greping(grep-rLock.|grepchan)给出以下输出:./pkg/runtime/chan.c:Lock;./pkg/runtime/chan_test.go:m.Lock()./pkg/

go - 在没有锁的情况下并发读取函数指针是否安全?

假设我有这个:gofunc(){forrangetime.Tick(1*time.Millisecond){a,b=b,a}}()其他地方:i:=a//对于这个问题,i相对于原始a或b的值是什么并不重要。唯一的问题是阅读a是否安全。也就是说,a是否有可能为nil、部分分配、无效、未定义……除有效值之外的任何值?I'vetriedtomakeitfail但到目前为止它总是成功(在我的Mac上)。我无法在TheGoMemoryModel中找到除此引用之外的任何具体信息文档:Readsandwritesofvalueslargerthanasinglemachinewordbehaveasm

c - Linux:如何找到持有特定锁的线程?

我有一个在Linux上运行的多线程程序,有时如果我对它运行gstack,就会有一个线程等待锁定很长时间(比如2-3分钟),Thread2(Thread0x5e502b90(LWP19853)):00x40000410in__kernel_vsyscall()10x400157b9in__lll_lock_wait()from/lib/i686/nosegneg/libpthread.so.020x40010e1din_L_lock_981()from/lib/i686/nosegneg/libpthread.so.030x40010d3binpthread_mutex_lock()fr

linux - 软锁的原因?

当我们启用CONFIG_DETECT_SOFTLOCKUP来检测软锁定时,它会创建一个名为khungtaskd的新任务,它将每1秒运行一次。如果khungtaskd在'n'秒内未能获得调度,则内核将声明软锁定。我的问题是阻止khungtaskd运行的原因是什么?我发现的一个是-试图在中断上下文中获取一个已经获取的自旋锁。还有哪些原因会导致软锁死? 最佳答案 太多中断(和计算机太慢)?检查/proc/interrupts看看。一些实时任务正在运行?中断几乎总是比其他任务具有更高的优先级。

c++ - 编写一个可以用作静态但需要锁的 C++ 类

我需要编写加载共享库的类。dlopen()/dlerror()序列需要一个锁以确保线程安全。classLibLoader{public:LibLoader(stringwhichLib);boolLoad(){Wait(lock);...dlopen()...dlerror()...}boolUnload(){Wait(lock);...dlclose()...dlerror()...}boolIsLoaded(){...}//...accesstosymbols...private:staticLocklock;}LockLock::lock;这个类的用户(同时会有多个)会想要让它成

c++ - 范围互斥锁的自定义 RAII C++ 实现

我不能使用boost或最新的std::thread库。要走的路是创建一个范围互斥体的自定义实现。一句话,当一个类实例被创建一个互斥锁。在类销毁时,互斥锁被解锁。任何可用的实现?我不想重新发明轮子。我需要使用pthreads。资源获取是初始化==“RAII” 最佳答案 NoteThisisanoldanswer.C++11containsbetterhelpersthataremoreplatformindependent:std::lock_guardstd::mutex,std::timed_mutex,std::recursiv

c++ - 同步锁的替代方案

我目前正在开发自己的小线程库,主要是为了学习,在消息队列的部分会涉及到很多地方的同步。以前我主要使用了锁、互斥锁和条件变量,它们都是同一主题的变体,一次只能由一个线程使用的部分的锁。与使用锁相比,同步有什么不同的解决方案吗?我读过一些地方的无锁同步,但有些人认为将锁隐藏在容器中是无锁的,我不同意。你只是没有明确地自己使用锁。 最佳答案 无锁算法通常涉及使用比较和交换(CAS)或类似的CPU指令,这些指令不仅以原子方式更新内存中的某些值,而且有条件地并带有成功指标。这样你就可以编写如下代码:1do2{3current_value=th

c++ - 在容器条目上放置互斥锁的安全有效的方法

C++的std::mutex没有移动构造函数。有一个goodreasonforthat.基本上,移动构造函数本身通常不是线程安全的,互斥锁的全部意义在于多个线程将尝试同时访问它。不幸的是,不能将互斥锁直接放入容器中。容器需要能够安全地移动其内容,而使用互斥体则无法做到这一点。简单的方法是用一个单独的互斥锁来保护整个容器。但是假设我想要比这更细粒度的控制?如果我通过容器实现数据库(例如:std::map),希望能够锁定单个记录,而不仅仅是整个数据库似乎是合理的。接下来想到的是使用std::unique_ptr解决问题。那会编译,但它并没有真正改rebase本问题,不是吗?移动存在问题的场

c++ - 如何创建锁定和解锁互斥锁的智能指针?

我有一个线程类,我想偶尔从中获取一个实例变量的指针。我希望这种访问受到互斥锁的保护,以便在客户端完成其指针之前阻止线程访问此资源。我最初的方法是返回一对对象:一个是指向资源的指针,一个是指向互斥锁对象的shared_ptr。这个shared_ptr持有对锁定对象的唯一引用,因此当它超出范围时应该解锁互斥锁。像这样的:voidA::getResource(){Lock*lock=newLock(&mMutex);returnpair>(&mResource,shared_ptr(lock));}此解决方案不太理想,因为它需要客户端持有整对对象。这样的行为破坏了线程安全:Resource*